<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: yangweijie <yangweijiester@gmail.com> <code-tech.diandian.com>
// +----------------------------------------------------------------------
namespace Admin\Model;

use Think\Model;

/**
 * 插件模型
 * 
 * @author yangweijie <yangweijiester@gmail.com>
 *         @date 2013-08-14 11:31:21
 */
class HooksModel extends Model {
	
	/**
	 * 查找后置操作
	 */
	protected function _after_find(&$result, $options) {
	}
	protected function _after_select(&$result, $options) {
		foreach ( $result as &$record ) {
			$this->_after_find ( $record, $options );
		}
	}
	protected $_validate = array (
			array (
					'name',
					'require',
					'钩子名称必须！' 
			), // 默认情况下用正则进行验证
			array (
					'description',
					'require',
					'钩子描述必须！' 
			) 
	) // 默认情况下用正则进行验证
;
	
	/**
	 * 文件模型自动完成
	 * 
	 * @var array
	 */
	protected $_auto = array (
			array (
					'update_time',
					NOW_TIME,
					self::MODEL_BOTH 
			) 
	);
	
	/**
	 * 更新插件里的所有钩子对应的插件
	 */
	public function updateHooks($addons_name) {
		$addons_class = get_addon_class ( $addons_name ); // 获取插件名
		if (! class_exists ( $addons_class )) {
			$this->error = "未实现{$addons_name}插件的入口文件";
			return false;
		}
		$methods = get_class_methods ( $addons_class );
		$hooks = $this->getField ( 'name', true );
		$common = array_intersect ( $hooks, $methods );
		if (! empty ( $common )) {
			foreach ( $common as $hook ) {
				$flag = $this->updateAddons ( $hook, array (
						$addons_name 
				) );
				if (false === $flag) {
					$this->removeHooks ( $addons_name );
					return false;
				}
			}
		}
		return true;
	}
	
	/**
	 * 更新单个钩子处的插件
	 */
	public function updateAddons($hook_name, $addons_name) {
		$o_addons = $this->where ( "name='{$hook_name}'" )->getField ( 'addons' );
		if ($o_addons)
			$o_addons = str2arr ( $o_addons );
		if ($o_addons) {
			$addons = array_merge ( $o_addons, $addons_name );
			$addons = array_unique ( $addons );
		} else {
			$addons = $addons_name;
		}
		$flag = D ( 'Hooks' )->where ( "name='{$hook_name}'" )->setField ( 'addons', arr2str ( $addons ) );
		if (false === $flag)
			D ( 'Hooks' )->where ( "name='{$hook_name}'" )->setField ( 'addons', arr2str ( $o_addons ) );
		return $flag;
	}
	
	/**
	 * 去除插件所有钩子里对应的插件数据
	 */
	public function removeHooks($addons_name) {
		$addons_class = get_addon_class ( $addons_name );
		if (! class_exists ( $addons_class )) {
			return false;
		}
		$methods = get_class_methods ( $addons_class );
		$hooks = $this->getField ( 'name', true );
		$common = array_intersect ( $hooks, $methods );
		if ($common) {
			foreach ( $common as $hook ) {
				$flag = $this->removeAddons ( $hook, array (
						$addons_name 
				) );
				if (false === $flag) {
					return false;
				}
			}
		}
		return true;
	}
	
	/**
	 * 去除单个钩子里对应的插件数据
	 */
	public function removeAddons($hook_name, $addons_name) {
		$o_addons = $this->where ( "name='{$hook_name}'" )->getField ( 'addons' );
		$o_addons = str2arr ( $o_addons );
		if ($o_addons) {
			$addons = array_diff ( $o_addons, $addons_name );
		} else {
			return true;
		}
		$flag = D ( 'Hooks' )->where ( "name='{$hook_name}'" )->setField ( 'addons', arr2str ( $addons ) );
		if (false === $flag)
			D ( 'Hooks' )->where ( "name='{$hook_name}'" )->setField ( 'addons', arr2str ( $o_addons ) );
		return $flag;
	}
}